
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>并发顺序消息配置 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>并发顺序消息配置 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">RocketMQ并发消费模式的核心工作流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">并发消费的工作流程分为三步：1. 消费者启动时创建消费线程池并获取队列分配信息；2. 为每个分配到的队列创建并执行消息拉取任务；3. 拉取到消息后，将其提交到消费线程池，由多个线程并行处理，处理完成后提交消费位点。</div>
          </div>
          <div class="card-source">来源: 1. 并发消费的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">RocketMQ是如何通过“队列锁定”机制来保证顺序消费的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在顺序消费模式下，RocketMQ通过“队列锁定”机制保证在同一时刻，一个消息队列只会被一个消费线程处理。消费线程在获取到队列的锁之后，会独占该队列，直到处理完当前批次的消息才会释放锁，从而保证了对单个队列内消息的顺序处理。</div>
          </div>
          <div class="card-source">来源: 1. 顺序消费的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">并发消费模式虽然吞吐量高，但它最主要的局限性是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">并发消费模式最主要的局限性是无法保证消息的消费顺序。因为同一个队列中的消息可能会被分发给多个不同的线程并发处理，导致处理顺序与生产顺序不一致。</div>
          </div>
          <div class="card-source">来源: 3.2 局限性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在实现顺序消费时，生产者需要如何配置才能确保相关消息被顺序处理？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在生产者端，必须使用一个`MessageQueueSelector`。通过这个选择器，可以根据业务标识（如订单ID）计算哈希值并选择一个固定的消息队列，从而确保所有与该业务标识相关的消息都被发送到同一个队列中。</div>
          </div>
          <div class="card-source">来源: 2.1 生产者端配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在RocketMQ消费者端，并发消费和顺序消费在注册消息监听器时有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">并发消费需要注册 `MessageListenerConcurrently` 接口的实现，其处理结果返回 `ConsumeConcurrentlyStatus`。而顺序消费则需要注册 `MessageListenerOrderly` 接口的实现，其处理结果返回 `ConsumeOrderlyStatus`。</div>
          </div>
          <div class="card-source">来源: 2.1 基本配置 (并发消费) 和 2.2 消费者端配置 (顺序消费)</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">顺序消费模式相较于并发消费模式，在吞吐量和延迟方面有哪些劣势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">顺序消费模式的吞吐量相对较低，因为单一队列在同一时刻只能被一个线程消费，限制了并发度。同时，由于需要等待前序消息处理完成，其平均延迟通常也高于并发消费。</div>
          </div>
          <div class="card-source">来源: 1. 吞吐量对比 和 2. 延迟对比</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">哪些业务场景适合使用RocketMQ的并发消费模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">并发消费模式适合大多数对消息顺序没有严格要求的业务场景，例如：日志收集、数据统计、通知推送以及相互独立的任务调度等。</div>
          </div>
          <div class="card-source">来源: 1. 适合并发消费的场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在选择消息消费模式时，哪些场景应优先考虑使用顺序消费？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当业务对消息处理顺序有严格要求时，应优先考虑顺序消费。典型的场景包括：订单处理（如创建、支付、发货）、金融交易、对象状态变更以及需要保证数据一致性的数据同步。</div>
          </div>
          <div class="card-source">来源: 2. 适合顺序消费的场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在优化顺序消费性能时，最主要的手段是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">优化顺序消费性能最主要的手段是增加Topic的队列数量，以此来提高整体的并行度。同时需要确保队列数量大于等于消费者实例的数量，以避免消费者空闲。</div>
          </div>
          <div class="card-source">来源: 4.2 顺序消费优化</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
